import {
    run,
    queryAll,
    queryOne,
    queryCount,
    insert,
    insertOrReplace,
    insertOrIgnore,
    update
} from '../ADB'

/* 枚举类型转数字，和服务端对应 */
const enum2Int = (enumStr) => {
    switch (enumStr) {
        case "USER": return 0
        case "GROUP": return 1
        default: return enumStr
    }
}

// userId从store中获取
import store from '../../store'

const getChatSessionUser = (contactId) => {
    return queryOne(`select * from chat_session_user where user_id = ? and contact_id = ?`, [store.getUserId(), contactId])
}

/* 
ws初始化的时候调用的新增或更新会话的函数，没有选中会话，所以信息都是未读（但是不是在这个函数里设置未读数量，那个在插入信息的时候调用(saveChatMessageList4Init)）。
后续在线时需要根据是否选中了要更新的会话来新增或更新，使用的就是不带4Init的函数
*/
const saveOrUpdateChatSessionUser4Init = (chatSessionUserList) => {
    return new Promise(async (resolve, reject) => {
        try {
            for (let i = 0; i < chatSessionUserList.length; i++) {
                const info = chatSessionUserList[i]
                info.status = 1  // 初始化设置会话状态为1，可以看见这个会话
                info.contactType = enum2Int(info.contactType)  // 将枚举类型映射回去
                // 先查看这个会话是否存在，存在则更新，不存在则插入
                let sessionData = await getChatSessionUser(info.contactId)
                if (sessionData) {
                    // 更新会话
                    await updateChatSessionUser4Init(info);
                } else {
                    // 插入会话
                    await saveChatSessionUser(info);
                }
            }
            resolve();
        } catch (e) {
            console.error("saveOrUpdateChatSessionUser4Init error: " + e)
            resolve();  // 忽略错误
        }
    })
}

/* 根据当前选中的是不是该会话来新增或更新会话信息。调用该函数的只会是别人给自己发送消息 */
const saveOrUpdateChatSessionUser = (currentSessionId, data) => {
    return new Promise(async (resolve, reject) => {
        data.contactType = enum2Int(data.contactType)  // 将枚举类型映射回去
        let sessionData = await getChatSessionUser(data.contactId)
        if (sessionData) {
            // 更新会话
            updateChatSessionUser(currentSessionId, data)
        } else {
            // 插入会话
            data.noReadCount = 1
            await saveChatSessionUser(data);
        }
        // 返回该会话的未读消息数量
        let noReadCount = 1;  // 原本没有会话则未读消息为1
        if (sessionData) {
            // 有会话，如果在这个会话的话未读消息就是0，不在则未读消息是原来的数量+1
            noReadCount = sessionData.sessionId == currentSessionId ? 0 : sessionData.noReadCount + 1
        }
        resolve(noReadCount);
    })
}

const saveChatSessionUser = (info) => {
    info.userId = store.getUserId()  // 补充用户id
    return insertOrIgnore('chat_session_user', info)
}

const updateChatSessionUser4Init = (info) => {
    const paramData = {
        userId: store.getUserId(),  // 补充用户id
        contactId: info.contactId
    }
    const updateInfo = Object.assign({}, info)
    // 不能更新id字段
    updateInfo.userId = null
    updateInfo.contactId = null
    return update('chat_session_user', updateInfo, paramData);
}

/* 更新增加会话的未读消息数量 */
const increaseNoReadCount = (contactId, increaseCount) => {
    // 不选择先查后更新，而是使用no_read_count = no_read_count + ?的方式更新，避免出现并发更新的问题
    let sql = `update chat_session_user set no_read_count = no_read_count + ? where user_id = ? and contact_id = ?`
    return run(sql, [increaseCount, store.getUserId(), contactId])
}

/* 获取显示的会话信息 */
const getChatSessionUserList = () => {
    return queryAll(`select * from chat_session_user where user_id = ? and status = 1`, [store.getUserId()])
}

/* 删除会话（设置会话不可见） */
const delChatSession = (contactId) => {
    // 将状态置为0即可
    return update('chat_session_user', { status: 0 }, { userId: store.getUserId(), contactId })
}

/* 设置会话置顶/取消置顶 */
const setChatSessionTop = (contactId, topType) => {
    return update('chat_session_user', { topType: topType }, { userId: store.getUserId(), contactId })
}

/* 根据当前选中的会话执行不同的更新会话信息的逻辑 */
const updateChatSessionUser = (currentSessionId, info) => {
    const { sessionId, contactName, lastMessage, lastReceiveTime, contactId, memberCount } = info
    const params = [lastMessage, lastReceiveTime]
    let sql = `update chat_session_user set last_message = ?, last_receive_time = ?, status = 1`;
    if (contactName) {
        sql = sql + `, contact_name = ?`
        params.push(contactName)
    }
    if (memberCount) {
        sql = sql + `, member_count = ?`
        params.push(memberCount)
    }
    if (sessionId != currentSessionId) {
        // 当前不在这个会话界面，则未读消息+1
        sql = sql + `, no_read_count = no_read_count + 1`
    }
    sql = sql + ` where user_id = ? and contact_id = ?`
    params.push(store.getUserId(), contactId)
    return run(sql, params)
}

/* 清空未读消息数量 */
const clearNoReadCount = (contactId) => {
    return run(`update chat_session_user set no_read_count = 0 where user_id = ? and contact_id = ?`, [store.getUserId(), contactId])
}

/* 更新会话里的名称 */
const updateContactName = (contactId, contactName) => {
    return update('chat_session_user', { contactName }, { userId: store.getUserId(), contactId })
}

/* 更新会话状态（是否可见） */
const updateChatSessionStatus = (contactId, status) => {
    return update('chat_session_user', { status }, { userId: store.getUserId(), contactId })
}

export {
    saveOrUpdateChatSessionUser4Init,
    saveOrUpdateChatSessionUser,
    increaseNoReadCount,
    getChatSessionUser,
    getChatSessionUserList,
    delChatSession,
    setChatSessionTop,
    updateChatSessionUser,
    clearNoReadCount,
    updateContactName,
    updateChatSessionStatus
}